package malagaAcoge.controller.beans;

import java.util.HashMap;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import malagaAcoge.controller.daos.DepartamentoDao;
import malagaAcoge.controller.daos.TecnicoDao;
import malagaAcoge.model.entities.Departamento;
import malagaAcoge.model.entities.Tecnico;
import malagaAcoge.utils.Utils;

import org.primefaces.event.RowEditEvent;

public class TecnicosBean {
	private Tecnico newTecnico;
	private Tecnico currentTecnico;
	private List<Departamento> departamentos;
	private HashMap<String, String> nombreDepartamentos;
	private HashMap<String, String> perfiles;
	private List<Tecnico> tecnicos;
	private String selectedDepartamento;
	private String selectedPerfil;

	public TecnicosBean() {
		new TecnicoDao();
		newTecnico = new Tecnico();
		currentTecnico = (Tecnico) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("tecnico");
	}

	public void setCurrentTecnico(Tecnico currentTecnico) {
		this.currentTecnico = currentTecnico;
	}

	public Tecnico getCurrentTecnico() {
		return currentTecnico;
	}

	public void setNewTecnico(Tecnico newTecnico) {
		this.newTecnico = newTecnico;
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("seleccionado", newTecnico);
	}

	public Tecnico getNewTecnico() {
		return newTecnico;
	}

	public void addTecnico() {
		if (newTecnico != null) {
			newTecnico.setDepartamentoBean(getDepatamento(Integer
					.parseInt(selectedDepartamento)));
			String encriptedPass = new Utils().encrypt(newTecnico
					.getContrasena());
			newTecnico.setContrasena(encriptedPass);
			newTecnico.setPerfil(selectedPerfil);
			TecnicoDao.createTecnico(newTecnico);
			selectedDepartamento = "";
			selectedPerfil = "";
		}
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Tecnico creado."));
		newTecnico = new Tecnico();
	}

	public void updateTecinco(RowEditEvent event) {
		Tecnico t = (Tecnico) event.getObject();
		if (!selectedDepartamento.equals("")) {
			t.setDepartamentoBean(getDepatamento(Integer
					.parseInt(selectedDepartamento)));
		}
		String encriptedPass = new Utils().encrypt(t.getContrasena());
		t.setContrasena(encriptedPass);
		TecnicoDao.mergeTecnico(t);
		selectedDepartamento = "";
		selectedPerfil = "";
	}

	public void deleteTecnico() {
		Tecnico t = (Tecnico) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("seleccionado");
		TecnicoDao.deleteTecnico(t.getIdTecnico());
		tecnicos.remove(t);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.remove("seleccionado");
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Tecnico borrado."));
		newTecnico = new Tecnico();
	}

	public void setDepartamentos(List<Departamento> departamentos) {
		this.departamentos = departamentos;
	}

	public List<Departamento> getDepartamentos() {
		if (departamentos == null || departamentos.isEmpty()) {
			new DepartamentoDao();
			departamentos = DepartamentoDao.findAll();
		}
		return departamentos;
	}

	public void setTecnicos(List<Tecnico> tecnicos) {
		this.tecnicos = tecnicos;
	}

	public List<Tecnico> getTecnicos() {
		if (tecnicos == null || tecnicos.isEmpty()) {
			tecnicos = TecnicoDao.findAll();
		}
		return tecnicos;
	}

	public void setSelectedDepartamento(String selectedDepartamento) {
		if (!selectedDepartamento.equals("")) {
			this.selectedDepartamento = selectedDepartamento;
		}
	}

	public String getSelectedDepartamento() {
		return selectedDepartamento;
	}

	public void setNombreDepartamentos(
			HashMap<String, String> nombreDepartamentos) {
		this.nombreDepartamentos = nombreDepartamentos;
	}

	public HashMap<String, String> getNombreDepartamentos() {
		nombreDepartamentos = new HashMap<String, String>();
		if (departamentos == null || departamentos.isEmpty()) {
			getDepartamentos();
		}
		for (Departamento dep : departamentos) {
			nombreDepartamentos.put(dep.getNombre(),
					String.valueOf(dep.getIdDepartamento()));
		}
		return nombreDepartamentos;
	}

	public void setPerfiles(HashMap<String, String> perfiles) {
		this.perfiles = perfiles;
	}

	public HashMap<String, String> getPerfiles() {
		perfiles = new HashMap<String, String>();
		perfiles.put("Administrador", "Administrador");
		perfiles.put("Director", "Director");
		perfiles.put("Coordinador", "Coordinador");
		perfiles.put("Tecnico", "Tecnico");
		return perfiles;
	}

	public void setSelectedPerfil(String selectedPerfil) {
		if (!selectedPerfil.equals("")) {
			this.selectedPerfil = selectedPerfil;
		}
	}

	public String getSelectedPerfil() {
		return selectedPerfil;
	}

	private Departamento getDepatamento(int id) {
		Departamento departamento = new Departamento();
		for (Departamento dep : getDepartamentos()) {
			if (dep.getIdDepartamento() == id) {
				departamento = dep;
			}
		}
		return departamento;
	}

}
